//
// Created by PC on 2024/9/4.
//
/*讲解: https://www.cnblogs.com/xiaoyezi-wink/p/10989190.html
OJ:https://www.luogu.com.cn/problem/P1824  1WA 1TLE
OJ:http://ybt.ssoier.cn:8088/problem_show.php?pid=1433 1WA 1TLE
 用的是暴力枚举, 没用二分
 *
 *农夫 John 建造了一座很长的畜栏，它包括N(2≤N≤100,000)个隔间，这些小隔间依次编号为x1,...,xN(0≤xi≤1,000,000,000). 但是，John的C(2≤C≤N)头牛们并不喜欢这种布局，而且几头牛放在一个隔间里，他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间，使任意两头牛之间的最小距离尽可能的大，那么，这个最大的最小距离是什么呢
 * 【输入】
第一行：空格分隔的两个整数N 隔间数和C 奶牛数 ；
第二行---第N+1 行：i+1行指出了xi 的位置。
【输出】
一个整数，最大的最小值。
【输入样例】
5 3
1 2 8 4 9
【输出样例】
3
【提示】
把牛放在1，4，8 这样最小距离是3。
 * */



#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 根据给定的间距v, 在隔间v中能放多少牛
int check(vector<int> v, int d)
{
    if (v.empty())
        return 0;
    int cow = 1; //奶牛数量cow, 至少能放一头牛 所以从1开始
    int cur = 0; // 当前隔间
    for (int i = 0; i < v.size(); ++i)
    {
        if ((v[i] - v[cur]) >= d)
        {
            ++cow;
            cur = i;
        }
    }
    return cow;
}

int main()
{

    vector<int> a;
    int n, c;
    cin >> n >> c;
    for (int i = 0; i < n; ++i)
    {
        int t;
        cin >> t;
        a.push_back(t);
    }
//    cout<<check(a,9);
    sort(a.begin(), a.end());
    // 倒序遍历, 因为要找符合条件里最大的
//    for (int i = 191; i >=0 ; --i)
    for (int i = a[a.size() - 1]/c; i >= 0; --i)
    {
        int t = check(a, i);
        if (t == c)
        {
            cout << i;
            return 0;
        }
    }
    // 如果都不符合 至少能放一头牛
    cout << 1;
    return 0;
}